[Coding012] LeetCode 19

Remove Nth Node From End of List

Ben 2023/08/02

More coding records

Get the knowledge flowing and circulating! :)

目录

题目:19. Remove Nth Node From End of List

Given the head of a linked list, remove the nth node from the end of the list and return its head.

Example 1:

img

Example 2:

Example 3:

Constraints:

Follow up: Could you do this in one pass?


代码1(配 · 手绘过程图)

removeN01

代码解读:two pass解法

  • 先遍历一遍链表,获取结点的总数;

  • 然后通过数值计算,看看待删除结点从头开始数的话,处于第几个;

  • 获取待删除结点的前一个结点,即可解答;

注意特判情况。

特殊测试样例:

复杂度分析

O(n), 但是最坏情况下,需要遍历2遍。

  • 第一遍,确定整个链表的长度;

  • 第二遍,找到待删除结点的前一个结点。


代码2(配 · 手绘过程图)

removeN02

代码解读:one pass解法

  • 双指针,首先让一个指针先跑x步(此时,剩下n-x步);

  • 然后让第二个指针开始加入奔跑行列,两个指针一起跑(跑完剩下的n-x步);

    • 此时,第2个指针应该还剩x步没跑。即,当第一个指针跑到底的时候,第二个指针就指向待删除结点的前一个结点了!

搞定!

一定要加dummy结点,这样操作起来非常的舒服、丝滑!!!很重要!!!

复杂度分析

O(n)

一遍过!


知识点积累 (Java)

  1. 双指针的妙用

    • 一个先走,另一个后走;互补可以走完整个数组。

    • 一个从左向右 ,一个从右向左 ;(具体案例在后面再说)